package com.zqweb.gulimall.essearch.thread;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadTest4 {
    public static ExecutorService threadPool = Executors.newFixedThreadPool(15);
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("main方法开始...当前时间为：" + format.format(new Date()));
        CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {
            System.out.println("开始查询商品介绍信息...");
            try {
                Thread.sleep(4000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "商品介绍";
        });
        CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> {
            System.out.println("开始查询商品属性信息...");
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return 123;
        });
        CompletableFuture<String> future3 = CompletableFuture.supplyAsync(() -> {
            System.out.println("开始查询商品图片信息...");
            try {
                Thread.sleep(8000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "图片url";
        });
        // 将所有业务任务都执行完毕，查询到相关的数据并返回时，才停止阻塞，继续get后面的业务方法
       /* String s1 = future1.get();
        Integer i1 = future2.get();
        String s2 = future3.get();*/

        /*
            对于多业务任务的场景，针对每个业务任务都需要手动添加1个get方法，太冗余了，可采用CompletableFuture提供的
            allOf或anyOf方法，来实现统一管理CompletableFuture实例，提高复用性
            补充：
            1、allOf方法得到1个Void返回值类型的CompletableFuture实例，真正数据的获取还是要通过具体future实例调用
            get方法获取
         */
        /*CompletableFuture<Void> allFutures = CompletableFuture.allOf(future1, future2, future3);
        allFutures.get();*/// 统一阻塞，只有所有future都get到数据，才结束
        CompletableFuture<Object> anyFuture = CompletableFuture.anyOf(future1, future2, future3);
        anyFuture.get();// 也是统一管理，但却是其中任一个future有get到数据，就结束阻塞

        /*System.out.println("所有想要查询的商品信息数据已经get，结果为：\n");
        System.out.println(future1.get() + " " + future2.get() + " " + future3.get());*/
        System.out.println("第1个get到的数据为：" + anyFuture.get());

        System.out.println("main方法结束...当前时间为：" + format.format(new Date()));
    }
}
